package site.lianwu.mybatis.plus.query.define;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import site.lianwu.mybatis.plus.query.QueryOption;

import java.util.Objects;

/**
 * 后置处理器，用于补充查询条件
 *
 * @param <T> 查询结果类型
 * @author LianWu
 * @see QueryOption
 */
@FunctionalInterface
public interface PostProcessor<T> {

    /**
     * 处理条件包装
     *
     * @param wrapper 条件包装
     */
    void process(QueryWrapper<T> wrapper);

    /**
     * 创建并返回一个新的{@code PostProcessor}实例，这允许将多个处理器串联起来，按顺序执行
     *
     * @param next 下一处理器
     * @return 返回一个新的后置处理器实例，将按顺序执行多个处理逻辑
     * @throws NullPointerException 若{@code next}参数为null
     */
    default PostProcessor<T> andThen(PostProcessor<T> next) {
        Objects.requireNonNull(next);
        return (wrapper) -> {
            process(wrapper);
            next.process(wrapper);
        };
    }

}
